Põhjalik juhend DataFrame'ide ühendamiseks Python Pandases, mis hõlmab erinevaid strateegiaid nagu sise-, välis-, vasak- ja parempoolne ühendus koos praktiliste näidetega globaalseks andmeanalüüsiks.
Python Pandase Ühendamine: DataFrame'i Ühendamise Strateegiate Valdamine Andmeanalüüsiks
Andmetega manipuleerimine on andmeanalüüsi oluline aspekt ja Pythoni Pandas teek pakub selleks võimsaid tööriistu. Nende tööriistade hulgas on DataFrame'ide ühendamine ('merging' ja 'joining') olulised operatsioonid andmekogumite kombineerimiseks ühiste veergude või indeksite alusel. See põhjalik juhend uurib erinevaid DataFrame'i ühendamise strateegiaid Pandases, andes teile teadmised, kuidas tõhusalt kombineerida ja analüüsida andmeid erinevatest allikatest.
DataFrame'i Ühendamise Mõistmine
DataFrame'ide ühendamine ('merging' ja 'joining') hõlmab kahe või enama DataFrame'i kombineerimist üheks DataFrame'iks ühise veeru või indeksi alusel. Peamine erinevus `merge` ja `join` vahel on see, et `merge` on Pandas teegi funktsioon ja ühendab DataFrame'e tavaliselt veergude alusel, samas kui `join` on DataFrame'i meetod, mis ühendab DataFrame'e peamiselt indeksite alusel, kuigi seda saab kasutada ka veergudega.
Põhimõisted
- DataFrame'id: Kahemõõtmelised sildistatud andmestruktuurid potentsiaalselt erinevat tüüpi veergudega.
- Ühised veerud/indeksid: Veerud või indeksid, millel on DataFrame'ides sama nimi ja andmetüüp ning mis on ühendamise aluseks.
- Ühenduse tüübid: Erinevad strateegiad mittevastavate ridade käsitlemiseks ühendamisprotsessi käigus, sealhulgas sise-, välis-, vasak- ja parempoolsed ühendused.
DataFrame'i Ühendamine Funktsiooniga `pd.merge()`
Funktsioon `pd.merge()` on peamine tööriist DataFrame'ide ühendamiseks veergude alusel. See pakub paindlikku viisi andmete kombineerimiseks ühe või mitme ühise veeru põhjal.
Süntaks
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
Parameetrid
- left: Vasakpoolne DataFrame, mida ühendada.
- right: Parempoolne DataFrame, mida ühendada.
- how: Läbiviidava ühenduse tüüp ('inner', 'outer', 'left', 'right'). Vaikimisi on 'inner'.
- on: Veeru(de) nimi, mille alusel ühendada. Need peavad leiduma mõlemas DataFrame'is.
- left_on: Vasakpoolses DataFrame'is kasutatava(te) ühendusvõtme(te)na toimiva(te) veeru(de) nimi.
- right_on: Parempoolses DataFrame'is kasutatava(te) ühendusvõtme(te)na toimiva(te) veeru(de) nimi.
- left_index: Kui on Tõene (True), kasutatakse ühendusvõtme(te)na vasakpoolse DataFrame'i indeksit.
- right_index: Kui on Tõene (True), kasutatakse ühendusvõtme(te)na parempoolse DataFrame'i indeksit.
- sort: Sorteerib tulemuseks saadud DataFrame'i leksikograafiliselt ühendusvõtmete järgi. Vaikimisi on Väär (False).
- suffixes: String-sufiksite ennik (tuple), mida rakendada kattuvate veerunimedele. Vaikimisi on ('_x', '_y').
- copy: Kui on Väär (False), välditakse võimaluse korral andmete kopeerimist uude DataFrame'i. Vaikimisi on Tõene (True).
- indicator: Kui on Tõene (True), lisatakse veerg nimega '_merge', mis näitab iga rea allikat.
- validate: Kontrollib, kas ühendus on määratud tüüpi. "one_to_one", "one_to_many", "many_to_one", "many_to_many".
Ühenduse Tüüpide Selgitus
Parameeter `how` funktsioonis `pd.merge()` määrab, millist tüüpi ühendus teostatakse. Erinevad ühenduse tüübid käsitlevad mittevastavaid ridu erinevalt.
Siseühendus (Inner Join)
Siseühendus tagastab ainult need read, millel on mõlemas DataFrame'is vastavad väärtused ühendusvõtmete alusel. Read, millel vastavus puudub, jäetakse tulemusest välja.
Näide:
Vaatleme kahte DataFrame'i:
import pandas as pd
# DataFrame 1: Klientide tellimused
df_orders = pd.DataFrame({
'order_id': [1, 2, 3, 4, 5],
'customer_id': [101, 102, 103, 104, 105],
'product_id': [1, 2, 1, 3, 2],
'quantity': [2, 1, 3, 1, 2]
})
# DataFrame 2: Klientide info
df_customers = pd.DataFrame({
'customer_id': [101, 102, 103, 106],
'customer_name': ['Alice', 'Bob', 'Charlie', 'David'],
'country': ['USA', 'Canada', 'UK', 'Australia']
})
# Siseühendus
df_inner = pd.merge(df_orders, df_customers, on='customer_id', how='inner')
print(df_inner)
Väljund:
order_id customer_id product_id quantity customer_name country
0 1 101 1 2 Alice USA
1 2 102 2 1 Bob Canada
2 3 103 1 3 Charlie UK
Selles näites ühendab siseühendus DataFrame'id `df_orders` ja `df_customers` veeru `customer_id` alusel. Tulemusse kaasatakse ainult kliendid, kes on teinud tellimusi. Klient 'David' (customer_id 106) jäetakse välja, kuna tal pole ühtegi tellimust.
Välisühendus (Outer Join / Full Outer Join)
Välisühendus tagastab kõik read mõlemast DataFrame'ist, sealhulgas mittevastavad read. Kui real pole teises DataFrame'is vastet, sisaldavad vastavad veerud väärtust `NaN` (Not a Number).
Näide:
# Välisühendus
df_outer = pd.merge(df_orders, df_customers, on='customer_id', how='outer')
print(df_outer)
Väljund:
order_id customer_id product_id quantity customer_name country
0 1.0 101 1.0 2.0 Alice USA
1 2.0 102 2.0 1.0 Bob Canada
2 3.0 103 1.0 3.0 Charlie UK
3 4.0 104 3.0 1.0 NaN NaN
4 5.0 105 2.0 2.0 NaN NaN
5 NaN 106 NaN NaN David Australia
Välisühendus hõlmab kõiki kliente ja kõiki tellimusi. Klientidel 104 ja 105 on tellimused, kuid puudub kliendiinfo, ja kliendil 106 on kliendiinfo, kuid puuduvad tellimused. Puuduvad väärtused on tähistatud kui `NaN`.
Vasakpoolne Ühendus (Left Join)
Vasakpoolne ühendus tagastab kõik read vasakpoolsest DataFrame'ist ja vastavad read parempoolsest DataFrame'ist. Kui vasakpoolse DataFrame'i real pole parempoolses DataFrame'is vastet, sisaldavad parempoolse DataFrame'i vastavad veerud väärtust `NaN`.
Näide:
# Vasakpoolne ühendus
df_left = pd.merge(df_orders, df_customers, on='customer_id', how='left')
print(df_left)
Väljund:
order_id customer_id product_id quantity customer_name country
0 1 101 1 2 Alice USA
1 2 102 2 1 Bob Canada
2 3 103 1 3 Charlie UK
3 4 104 3 1 NaN NaN
4 5 105 2 2 NaN NaN
Vasakpoolne ühendus hõlmab kõiki tellimusi DataFrame'ist `df_orders`. Klientidel 104 ja 105 on tellimused, kuid puudub kliendiinfo, seega on nende tellimuste puhul veergudes `customer_name` ja `country` väärtuseks `NaN`.
Parempoolne Ühendus (Right Join)
Parempoolne ühendus tagastab kõik read parempoolsest DataFrame'ist ja vastavad read vasakpoolsest DataFrame'ist. Kui parempoolse DataFrame'i real pole vasakpoolses DataFrame'is vastet, sisaldavad vasakpoolse DataFrame'i vastavad veerud väärtust `NaN`.
Näide:
# Parempoolne ühendus
df_right = pd.merge(df_orders, df_customers, on='customer_id', how='right')
print(df_right)
Väljund:
order_id customer_id product_id quantity customer_name country
0 1.0 101 1.0 2.0 Alice USA
1 2.0 102 2.0 1.0 Bob Canada
2 3.0 103 1.0 3.0 Charlie UK
3 NaN 106 NaN NaN David Australia
Parempoolne ühendus hõlmab kõiki kliente DataFrame'ist `df_customers`. Kliendil 106 on kliendiinfo, kuid puuduvad tellimused, seega on selle kliendi puhul veergudes `order_id`, `product_id` ja `quantity` väärtuseks `NaN`.
DataFrame'i Ühendamine Meetodiga `df.join()`
Meetodit `df.join()` kasutatakse peamiselt DataFrame'ide ühendamiseks nende indeksite alusel. Seda saab kasutada ka veergude alusel ühendamiseks, kuid tavaliselt on veerupõhiste ühenduste jaoks mugavam kasutada funktsiooni `pd.merge()`.
Süntaks
DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
Parameetrid
- other: Teine DataFrame, mida ühendada.
- on: Veeru nimi, mille alusel ühendada. Tuleb edastada, kui ühendusvõtmena ei kasutata indeksit.
- how: Kuidas käsitleda vasaku ja parema hulga operatsiooni. Vaikimisi on 'left'.
- lsuffix: Sufiks, mida kasutada vasakpoolsest DataFrame'ist kattuvate veerunimede ülekirjutamiseks.
- rsuffix: Sufiks, mida kasutada parempoolsest DataFrame'ist kattuvate veerunimede ülekirjutamiseks.
- sort: Sorteerib tulemuseks saadud DataFrame'i leksikograafiliselt ühendusvõtmete järgi. Vaikimisi on Väär (False).
Indeksi Alusel Ühendamine
Indeksi alusel ühendamisel parameetrit `on` ei kasutata.
Näide:
# DataFrame 1: Klientide tellimused, kus kliendi ID on indeksiks
df_orders_index = df_orders.set_index('customer_id')
# DataFrame 2: Klientide info, kus kliendi ID on indeksiks
df_customers_index = df_customers.set_index('customer_id')
# Indeksi alusel ühendamine (vasakpoolne ühendus)
df_join_index = df_orders_index.join(df_customers_index, how='left')
print(df_join_index)
Väljund:
order_id product_id quantity customer_name country
customer_id
101 1 1 2 Alice USA
102 2 2 1 Bob Canada
103 3 1 3 Charlie UK
104 4 3 1 NaN NaN
105 5 2 2 NaN NaN
Selles näites kasutatakse meetodit `join()`, et teostada vasakpoolne ühendus indeksi (`customer_id`) alusel. Tulemus on sarnane `pd.merge()` abil tehtud vasakpoolse ühendusega, kuid ühendus põhineb indeksil, mitte veerul.
Veeru Alusel Ühendamine
Selleks, et ühendada veeru alusel kasutades `df.join()`, peate määrama parameetri `on`.
Näide:
# Veeru alusel ühendamine
df_join_column = df_orders.join(df_customers.set_index('customer_id'), on='customer_id', how='left')
print(df_join_column)
Väljund:
order_id customer_id product_id quantity customer_name country
0 1 101 1 2 Alice USA
1 2 102 2 1 Bob Canada
2 3 103 1 3 Charlie UK
3 4 104 3 1 NaN NaN
4 5 105 2 2 NaN NaN
See näide demonstreerib `df_orders` ja `df_customers` ühendamist veeru `customer_id` abil. Pange tähele, et enne ühenduse teostamist määratakse `df_customers` DataFrame'is `customer_id` indeksiks.
Kattuvate Veergude Käsitlemine
DataFrame'ide ühendamisel on tavaline, et esineb kattuvaid veerunimesid (veerud, millel on mõlemas DataFrame'is sama nimi). Pandas pakub nende olukordade lahendamiseks parameetrit `suffixes` funktsioonis `pd.merge()` ning parameetreid `lsuffix` ja `rsuffix` meetodis `df.join()`.
Sufiksite Kasutamine Funktsioonis `pd.merge()`
Parameeter `suffixes` võimaldab teil määrata sufiksid, mis lisatakse kattuvatele veerunimedele nende eristamiseks.
Näide:
# DataFrame 1: Tooteinfo
df_products1 = pd.DataFrame({
'product_id': [1, 2, 3],
'product_name': ['Product A', 'Product B', 'Product C'],
'price': [10, 20, 15]
})
# DataFrame 2: Tooteinfo (potentsiaalselt uuendatud hindadega)
df_products2 = pd.DataFrame({
'product_id': [1, 2, 4],
'product_name': ['Product A', 'Product B', 'Product D'],
'price': [12, 18, 25]
})
# Ühendamine sufiksitega
df_merged_suffixes = pd.merge(df_products1, df_products2, on='product_id', suffixes=('_old', '_new'))
print(df_merged_suffixes)
Väljund:
product_id product_name_old price_old product_name_new price_new
0 1 Product A 10 Product A 12
1 2 Product B 20 Product B 18
Selles näites on veerud `product_name` ja `price` olemas mõlemas DataFrame'is. Parameeter `suffixes` lisab sufiksid `_old` ja `_new`, et eristada vastavalt vasak- ja parempoolse DataFrame'i veerge.
Parameetrite `lsuffix` ja `rsuffix` Kasutamine Meetodis `df.join()`
Parameetrid `lsuffix` ja `rsuffix` pakuvad sarnast funktsionaalsust meetodi `df.join()` jaoks. `lsuffix` lisatakse vasakpoolse DataFrame'i kattuvatele veergudele ja `rsuffix` parempoolse DataFrame'i omadele.
Näide:
# Ühendamine lsuffix ja rsuffix parameetritega
df_products1_index = df_products1.set_index('product_id')
df_products2_index = df_products2.set_index('product_id')
df_joined_suffixes = df_products1_index.join(df_products2_index, lsuffix='_old', rsuffix='_new', how='outer')
print(df_joined_suffixes)
Väljund:
product_name_old price_old product_name_new price_new
product_id
1 Product A 10.0 Product A 12.0
2 Product B 20.0 Product B 18.0
3 Product C 15.0 NaN NaN
4 NaN NaN Product D 25.0
Praktilised Näited ja Kasutusjuhud
DataFrame'ide ühendamist kasutatakse laialdaselt erinevates andmeanalüüsi stsenaariumides. Siin on mõned praktilised näited:
Müügiandmete Kombineerimine Tooteinfoga
Levinud kasutusjuht on müügiandmete kombineerimine tooteinfoga. Oletame, et teil on DataFrame müügitehingutega ja teine DataFrame tooteandmetega. Saate need DataFrame'id ühendada, et rikastada müügiandmeid tooteinfoga.
Näide:
# Müügitehingute andmed
df_sales = pd.DataFrame({
'transaction_id': [1, 2, 3, 4, 5],
'product_id': [101, 102, 103, 101, 104],
'quantity': [2, 1, 3, 1, 2],
'sales_date': ['2023-01-15', '2023-02-20', '2023-03-10', '2023-04-05', '2023-05-01']
})
# Tooteinfo andmed
df_products = pd.DataFrame({
'product_id': [101, 102, 103, 104],
'product_name': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics'],
'price': [1200, 25, 75, 300]
})
# Müügiandmete ühendamine tooteinfoga
df_sales_enriched = pd.merge(df_sales, df_products, on='product_id', how='left')
print(df_sales_enriched)
Väljund:
transaction_id product_id quantity sales_date product_name category price
0 1 101 2 2023-01-15 Laptop Electronics 1200
1 2 102 1 2023-02-20 Mouse Electronics 25
2 3 103 3 2023-03-10 Keyboard Electronics 75
3 4 101 1 2023-04-05 Laptop Electronics 1200
4 5 104 2 2023-05-01 Monitor Electronics 300
Tulemuseks olev DataFrame `df_sales_enriched` sisaldab müügitehinguid koos vastava tooteinfoga, mis võimaldab müügitrendide ja toodete jõudluse üksikasjalikumat analüüsi.
Kliendiandmete Kombineerimine Demograafilise Teabega
Teine levinud kasutusjuht on kliendiandmete kombineerimine demograafilise teabega. See võimaldab analüüsida klientide käitumist demograafiliste tegurite põhjal.
Näide:
# Kliendiandmed
df_customers = pd.DataFrame({
'customer_id': [1, 2, 3, 4, 5],
'customer_name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'city': ['New York', 'London', 'Tokyo', 'Sydney', 'Berlin']
})
# Demograafilise teabe andmed
df_demographics = pd.DataFrame({
'city': ['New York', 'London', 'Tokyo', 'Sydney', 'Berlin'],
'population': [8419000, 8982000, 13960000, 5312000, 3769000],
'average_income': [75000, 65000, 85000, 90000, 55000]
})
# Kliendiandmete ühendamine demograafilise teabega
df_customer_demographics = pd.merge(df_customers, df_demographics, on='city', how='left')
print(df_customer_demographics)
Väljund:
customer_id customer_name city population average_income
0 1 Alice New York 8419000 75000
1 2 Bob London 8982000 65000
2 3 Charlie Tokyo 13960000 85000
3 4 David Sydney 5312000 90000
4 5 Eve Berlin 3769000 55000
Tulemuseks olev DataFrame `df_customer_demographics` sisaldab kliendiandmeid koos nende vastavate linnade demograafilise teabega, mis võimaldab analüüsida klientide käitumist linna demograafia põhjal.
Globaalse Tarneahela Andmete Analüüsimine
Pandase ühendamine on väärtuslik globaalsete tarneahela andmete analüüsimisel, kus teave on sageli jaotatud mitme tabeli vahel. Näiteks tarnijaandmete, saadetiseinfo ja müüginumbrite sidumine võib paljastada kitsaskohti ja optimeerida logistikat.
Näide:
# Tarnija andmed
df_suppliers = pd.DataFrame({
'supplier_id': [1, 2, 3],
'supplier_name': ['GlobalTech', 'EuroParts', 'AsiaSource'],
'location': ['Taiwan', 'Germany', 'China']
})
# Saadetise andmed
df_shipments = pd.DataFrame({
'shipment_id': [101, 102, 103, 104],
'supplier_id': [1, 2, 3, 1],
'destination': ['USA', 'Canada', 'Australia', 'Japan'],
'shipment_date': ['2023-01-10', '2023-02-15', '2023-03-20', '2023-04-25']
})
# Tarnija- ja saadetiseandmete ühendamine
df_supply_chain = pd.merge(df_shipments, df_suppliers, on='supplier_id', how='left')
print(df_supply_chain)
Väljund:
shipment_id supplier_id destination shipment_date supplier_name location
0 101 1 USA 2023-01-10 GlobalTech Taiwan
1 102 2 Canada 2023-02-15 EuroParts Germany
2 103 3 Australia 2023-03-20 AsiaSource China
3 104 1 Japan 2023-04-25 GlobalTech Taiwan
Täpsemad Ühendamistehnikad
Ühendamine Mitme Veeru Alusel
Saate DataFrame'e ühendada mitme veeru alusel, edastades parameetrile `on` veerunimede loendi.
Näide:
# DataFrame 1
df1 = pd.DataFrame({
'product_id': [1, 1, 2, 2],
'color': ['red', 'blue', 'red', 'blue'],
'quantity': [10, 15, 20, 25]
})
# DataFrame 2
df2 = pd.DataFrame({
'product_id': [1, 1, 2, 2],
'color': ['red', 'blue', 'red', 'blue'],
'price': [5, 7, 8, 10]
})
# Ühendamine mitme veeru alusel
df_merged_multiple = pd.merge(df1, df2, on=['product_id', 'color'], how='inner')
print(df_merged_multiple)
Väljund:
product_id color quantity price
0 1 red 10 5
1 1 blue 15 7
2 2 red 20 8
3 2 blue 25 10
Ühendamine Erinevate Veerunimedega
Kui ühendusveergudel on kahes DataFrame'is erinevad nimed, saate ühendamiseks kasutatavate veerunimede määramiseks kasutada parameetreid `left_on` ja `right_on`.
Näide:
# DataFrame 1
df1 = pd.DataFrame({
'product_id': [1, 2, 3],
'product_name': ['Product A', 'Product B', 'Product C']
})
# DataFrame 2
df2 = pd.DataFrame({
'id': [1, 2, 4],
'price': [10, 20, 25]
})
# Ühendamine erinevate veerunimedega
df_merged_different = pd.merge(df1, df2, left_on='product_id', right_on='id', how='left')
print(df_merged_different)
Väljund:
product_id product_name id price
0 1 Product A 1.0 10.0
1 2 Product B 2.0 20.0
2 3 Product C NaN NaN
Indikaatori Kasutamine Ühenduse Analüüsiks
Parameeter `indicator` funktsioonis `pd.merge()` lisab tulemuseks olevale DataFrame'ile veeru nimega `_merge`, mis näitab iga rea allikat. See on kasulik mõistmaks, millised read vastasid ja millised mitte.
Näide:
# Ühendamine indikaatoriga
df_merged_indicator = pd.merge(df_orders, df_customers, on='customer_id', how='outer', indicator=True)
print(df_merged_indicator)
Väljund:
order_id customer_id product_id quantity customer_name country _merge
0 1.0 101 1.0 2.0 Alice USA both
1 2.0 102 2.0 1.0 Bob Canada both
2 3.0 103 1.0 3.0 Charlie UK both
3 4.0 104 3.0 1.0 NaN NaN left_only
4 5.0 105 2.0 2.0 NaN NaN left_only
5 NaN 106 NaN NaN David Australia right_only
Veerg `_merge` näitab, kas rida pärineb mõlemast DataFrame'ist (`both`), ainult vasakpoolsest DataFrame'ist (`left_only`) või ainult parempoolsest DataFrame'ist (`right_only`).
Ühenduse Tüüpide Valideerimine
Parameeter `validate` tagab, et ühendamisoperatsioon vastab DataFrame'ide vahelistele oodatud seosetüüpidele (nt 'one_to_one', 'one_to_many'). See aitab vältida andmete ebajärjekindlust ja vigu.
Näide:
# Näide üks-ühele valideerimisega
df_users = pd.DataFrame({
'user_id': [1, 2, 3],
'username': ['john_doe', 'jane_smith', 'peter_jones']
})
df_profiles = pd.DataFrame({
'user_id': [1, 2, 3],
'profile_description': ['Software Engineer', 'Data Scientist', 'Project Manager']
})
# Üks-ühele ühenduse teostamine valideerimisega
merged_df = pd.merge(df_users, df_profiles, on='user_id', validate='one_to_one')
print(merged_df)
Kui ühendus rikub määratud valideerimist (nt mitu-ühele seos, kui on määratud 'one_to_one'), tõstatatakse `MergeError`, mis teavitab teid võimalikest andmete terviklikkuse probleemidest.
Jõudlusega Seotud Kaalutlused
DataFrame'ide ühendamine võib olla arvutuslikult kulukas, eriti suurte andmekogumite puhul. Siin on mõned näpunäited jõudluse parandamiseks:
- Kasutage sobivat ühenduse tüüpi: Õige ühenduse tüübi valimine võib jõudlust oluliselt mõjutada. Näiteks kui vajate ainult vastavaid ridu, kasutage siseühendust.
- Indekseerige ühendusveerud: Ühendusveergude indekseerimine võib ühendamisprotsessi kiirendada.
- Kasutage sobivaid andmetüüpe: Veenduge, et ühendusveergudel oleksid ühilduvad andmetüübid.
- Vältige tarbetuid koopiaid: Seadke `copy=False` funktsioonis `pd.merge()` ja meetodis `df.join()`, et vältida andmete tarbetute koopiate loomist.
Kokkuvõte
DataFrame'ide ühendamine on andmeanalüüsi põhioperatsioonid. Mõistes erinevaid ühenduse tüüpe ja tehnikaid, saate tõhusalt kombineerida ja analüüsida andmeid erinevatest allikatest, avades väärtuslikke teadmisi ja aidates kaasa teadlike otsuste tegemisele. Alates müügiandmete kombineerimisest tooteinfoga kuni globaalsete tarneahelate analüüsimiseni – nende tehnikate valdamine annab teile enesekindluse keeruliste andmemanipulatsiooni ülesannetega toimetulekuks. Pidage meeles, et suurte andmekogumitega töötades tuleb arvestada jõudlusega seotud tagajärgedega ning kasutada täpsema ja sisukama analüüsi jaoks täiustatud funktsioone nagu parameetrid `indicator` ja `validate`.